package demo

//一对多 父亲对应多个儿子
// type Fu struct {
// 	Id   int
// 	Name string
// 	Zis  []Zi
// }

// 儿子只有一个父亲
// type Zi struct {
// 	Id   int
// 	Name string
// 	FuId int
// 	Fu   Fu
// }

//重写外键名称 如果不指明FatherId，则外键关系一般是 FuId
// type Fu struct {
// 	Id   int
// 	Name string
// 	Zis  []Zi `gorm:"foreignKey:FatherId"`
// }

// type Zi struct {
// 	Id       int
// 	Name     string
// 	FatherId int
// 	Fu       Fu `gorm:"foreignKey:FatherId"`
// }

//重写外键引用 不用Id字段

type Fu struct {
	Id   int
	Name string
	Zis  []Zi
}

type Zi struct {
	Id   int
	Name string
	FuId int
	Fu   Fu
}

func OneToMany() {
	Init()
	// DB.Debug().AutoMigrate(&Zi{}, &Fu{})
	//一对多创建
	// 父亲创建同时创建儿子
	// DB.Create(&Fu{Name: "张三", Zis: []Zi{{Name: "小明"}, {Name: "小红"}, {Name: "小刚"}}})
	//儿子创建同时创建父亲
	// DB.Create(&Zi{Name: "小李", Fu: Fu{Name: "李四"}})
	//儿子创建绑定父亲 如果又Fu对象会创建Fu对象并且把Fu创建后的ID取代输入的FuId,创建的Fu对象中有ZI对象，也会创建子对象
	// DB.Create(&Zi{Name: "小赵", FuId: 1, Fu: Fu{Name: "赵六"}})

	//一对多查询
	//预加载
	// var fu Fu

	// DB.Preload("Zis").First(&fu, 1)
	// fmt.Println(fu)

	//多重预加载
	// DB.Preload("Zis.Fu.Zis.Fu").First(&fu, 1)
	// fmt.Println(fu)

	//条件预加载
	// DB.Preload("Zis", "name = ?", "小明").First(&fu, 1)
	// fmt.Println(fu)
	// DB.Debug().Preload("Zis", func(db *gorm.DB) *gorm.DB {
	// 	return db.Where("name = ?", "小明")
	// }).First(&fu)
	// fmt.Println(fu)

	//一对多删除
	// 清除外键关系 把ID = 1 的Fu下面所有Zis的fuId置空
	// var fu Fu
	// DB.Preload("Zis").Take(&fu, 1)
	// DB.Model(&fu).Association("Zis").Delete(&fu.Zis)

	//删除fu fu下面的zi也跟着一起删除
	// DB.Take(&fu, 2)
	// DB.Select("Zis").Delete(&fu)
}
